给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。
示例 1:
输入: s = "abcabcbb" 输出: 3 解释:因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:
输入: s = "bbbbb" 输出: 1 解释:因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3:
输入: s = "pwwkew" 输出: 3 解释:因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
js
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function (s) {
const occ = new Set()
const n = s.length
let r = -1
let ans = 0
for (let i = 0; i < n; i++) {
if (i != 0) {
occ.delete(s.charAt(i - 1))
}
while (r + 1 < n && !occ.has(s.charAt(r + 1))) {
occ.add(s.charAt(r + 1))
r++
}
ans = Math.max(ans, r - i + 1)
}
return ans
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
滑动窗口 先创建一个 set 然后开始滑动窗口 如果下一个值不在集合内、就扩大窗口;如果下一个值在集合内、就向右滑动窗口同时重置窗口大小 这时计算 ans
代码创建右指针 r = -1 表示窗口的右边界还没有开始 如果 i
不在初始位置,将左指针指向的字符从集合中移除。这样可以保证窗口内的字符始终是不重复的。 左指针和右指针都应该向右移动以表示一个窗口 每次右指针移动时,将字符添加到集合中直到遇到重复字符或右指针到达字符串的末尾